package com.evan.idempotent.distributedlock;

import com.evan.idempotent.warpper.IdempotentRunnable;
import com.evan.idempotent.warpper.IdempotentSupplier;

import java.util.concurrent.TimeUnit;

/**
 * @Description: 分布式锁接口
 * @Author liudeguang
 */
public interface DistributedLock {


    /**
     * 加锁
     *
     * @param key       锁key
     * @param waitTime  尝试加锁，等待时间（ms）
     * @param leaseTime 上锁后的失效时间（ms）
     * @param success   锁成功执行的逻辑
     * @param fail      锁失败执行的逻辑
     * @param <T>
     * @return
     */
    <T> T lock(String key, long waitTime, long leaseTime, IdempotentSupplier<T> success, IdempotentSupplier<T> fail);

    /**
     * 加锁，加锁失败立即返回
     *
     * @param key       锁key
     * @param leaseTime 上锁后的失效时间（ms）
     * @param success   锁成功执行的逻辑
     * @param fail      锁失败执行的逻辑
     * @param <T>
     * @return
     */
    <T> T lock(String key, long leaseTime, IdempotentSupplier<T> success, IdempotentSupplier<T> fail);

    /**
     * 加锁，加锁失败立即返回
     *
     * @param key       锁key
     * @param leaseTime 上锁后的失效时间（ms）
     * @param timeUnit  时间单位
     * @param success   锁成功执行的逻辑
     * @param fail      锁失败执行的逻辑
     * @param <T>
     * @return
     */
    <T> T lock(String key, long leaseTime, TimeUnit timeUnit, IdempotentSupplier<T> success, IdempotentSupplier<T> fail);

    /**
     * 加锁
     *
     * @param key       锁key
     * @param waitTime  尝试加锁，等待时间（ms）
     * @param leaseTime 上锁后的失效时间（ms）
     * @param success   锁成功执行的逻辑
     * @param fail      锁失败执行的逻辑
     */
    void lock(String key, long waitTime, long leaseTime, IdempotentRunnable success, IdempotentRunnable fail);

    /**
     * 加锁，加锁失败立即返回
     *
     * @param key       锁key
     * @param leaseTime 上锁后的失效时间（ms）
     * @param success   锁成功执行的逻辑
     * @param fail      锁失败执行的逻辑
     */
    void lock(String key, long leaseTime, IdempotentRunnable success, IdempotentRunnable fail);

    /**
     * 加锁，加锁失败立即返回
     *
     * @param key       锁key
     * @param leaseTime 上锁后的失效时间
     * @param timeUnit  时间单位
     * @param success   锁成功执行的逻辑
     * @param fail      锁失败执行的逻辑
     */
    void lock(String key, long leaseTime, TimeUnit timeUnit, IdempotentRunnable success, IdempotentRunnable fail);
}
